package com.example.jvm_lecture.classloader;

/**
 * 重要
 *
 *  类  连接 ==》 加载 ==》 初始化         、、准备阶段是在 初始化 之前的
 * */
public class MyTest6 {
    public static void main(String[] args) {
        //在getInstance（）的时候，返回的是singleton 而这个singleton又是 上面new 出来的，
        Singleton singleton = Singleton.getInstance();
        System.out.println("counter1: "+Singleton.counter1);
        System.out.println("counter2: "+Singleton.counter2);
        // 输出的结果都是1
    }
}

class Singleton{
    //初始化是从上到下 的顺序

    //隐示 的赋值为 0
    public static int counter1;
    //显示 的赋值为 0
    //public static int counter2 = 0;
    private static Singleton singleton = new Singleton();
    private Singleton(){
        counter1++;
        // 这里在执行counter2++ 的时候 其实counter2 已经在准备阶段 已近隐示 赋值 好了（是0）
        counter2++;
        System.out.println("Singleton(counter1):" + counter1);
        System.out.println("Singleton(counter2):" + counter2 );

    }
    // 如果counter2 放到后面 ：： 会重新给counter2 初始化为0 ，就取代了上面 的 counter2++
    public static int counter2 = 0;  //在准备阶段 就会个counter2赋值上0


    public static Singleton getInstance(){
        //在返回singleton 之前，它必须 new 出来的
        return singleton;
    }

}